Grundfälle der ebenen Vektoralgebra
Oktober 2020
Keywords: Webkinematik, Webentwicklung, Getriebekinematik, Mechanismentechnik, Bewegungsübertragung, Kraftübertragung, Vektoralgebra, g2, mec2
6.4 Grundfall V
6.4.1 Aufgabenstellung
Analysieren Sie den Mechanismus und stellen Sie ihn mit g2 interaktiv im Browser dar. Überlegen Sie dazu in welcher Lage
Tipp: Wenn Sie durch überlegen nicht auf die entsprechende Stellung kommen, wählen Sie
Abb. 6.4: Gegebener Mechanismus
Geg.:
6.4.2 Mathematik
Um den Mechanismus interaktiv in ein Canvas zu rendern, benötigen wir die Koordinaten der Punkte
Aufstellen der Maschengleichung und Sortieren nach Bekannten und Unbekannten liefert Grundfall V:
mit
Grundfall V:
Lösung:
Mit getauschten Variablen ergibt sich für unseren Mechanismus
Quadrieren der Hilfsgeraden
Es folgen der unbekannte Winkel
Der größte Abstand zwischen den Punkten
Abb. 6.5: Ermittlung von
Mit dem Satz des Pythagoras lässt sich
Der Mechanismus ist nun vollständig bestimmt.
6.4.3 Code
Wir legen wie immer eine neue HTML-Datei an, die unter anderem ein 400x300px Canvas sowie einen Range-Input inkl. Output für
Diesmal legen wir die Gliedlängen des Mechanismus
const
//...
a = 50, d = 3*a, e = 3/2*a,
smax = Math.sqrt((a + d)*(a + d) - e*e),
//...
Unser mec-Objekt enthält dann Getter für
Das mec-Objekt sollte so aussehen:
mec = {
get ephi() { return {x:Math.cos(phi), y:Math.sin(phi)}; },
get g() { return {x:d - a*Math.cos(phi), y:-a*Math.sin(phi)}; },
get gg() { return a*a + d*d - 2*a*d*Math.cos(phi); },
get s() { return Math.sqrt(this.gg - e*e); },
get psi() {
return Math.atan2( (1/this.gg)*(-e*this.g.y + this.s*this.g.x), (1/this.gg)*(-e*this.g.x - this.s*this.g.y) )
},
get epsi() { return { x:Math.cos(this.psi), y:Math.sin(this.psi)}; },
// Gelenkpunkte
A0: {x:0, y:0},
get B0() { return {x:d, y:0}; },
get A() { return {x:a*this.ephi.x, y:a*this.ephi.y}; },
get B() { return {x:this.B0.x + e*this.epsi.x, y:this.B0.y + e*this.epsi.y}; },
get C() { return {x:this.B.x + (smax + 40)*(- this.epsi.y), y:this.B.y + (smax + 40)*this.epsi.x}; }
}
Es folgen nach alt bekannten Schema Anpassungen am world-Objekt
world = g2().clr()
.view({cartesian:true,x: 150,y: 180}) // Nullpunkt verschoben
.use({grp:g})
.nodfix({x:0,y:0})
.nodfix(mec.B0),
und der Funktion position()
function position() {
g.del()
.beam2({pts:[mec.B0.x, mec.B0.y, mec.B.x, mec.B.y, mec.C.x, mec.C.y]})
.slider({...mec.A, w: (mec.psi+pi/2), fs:"@nodfill"})
.bar2({x1: mec.A0.x,y1:mec.A0.y, x2:mec.A.x,y2:mec.A.y})
.nod(mec.A)
}
6.4.4 Ergebnis
Der fertige Quelltext sollte folgendermaßen aussehen:
<!doctype html>
<html>
<head>
<meta charset='utf-8'>
<title>Kurbelschleife</title>
</head>
<body>
<h2>Kurbelschleife - Grundfall 5</h2>
<canvas id="c" width="400" height="300" style="border-width:1px;border-style:solid"></canvas>
<br>
<label for="phislider">φ:
<input type="range" id="phislider" style="width:330px;vertical-align:middle;padding:0" min="0" max="360" value="0">
<output id="phiout" for="phislider">0</output>°
</label>
<script src="https://gitcdn.xyz/repo/goessner/g2/master/src/g2.js"></script>
<script>
const cnv = document.getElementById('c'),
ctx = cnv.getContext('2d'),
phislider = document.getElementById('phislider'),
phiout = document.getElementById('phiout'),
pi = Math.PI,
a = 50, d = 3*a, e = 3/2*a,
smax = Math.sqrt((a + d)*(a + d) - e*e),
mec = {
get ephi() { return {x:Math.cos(phi), y:Math.sin(phi)}; },
get g() { return {x:d - a*Math.cos(phi), y:-a*Math.sin(phi)}; },
get gg() { return a*a + d*d - 2*a*d*Math.cos(phi); },
get s() { return Math.sqrt(this.gg - e*e); },
get psi() {
return Math.atan2( (1/this.gg)*(-e*this.g.y + this.s*this.g.x), (1/this.gg)*(-e*this.g.x - this.s*this.g.y) )
},
get epsi() { return { x:Math.cos(this.psi), y:Math.sin(this.psi)}; },
// Gelenkpunkte
A0: {x:0, y:0},
B0: {x:d, y:0},
get A() { return {x:a*this.ephi.x, y:a*this.ephi.y}; },
get B() { return {x:this.B0.x + e*this.epsi.x, y:this.B0.y + e*this.epsi.y}; },
get C() { return {x:this.B.x + (smax + 25)*(- this.epsi.y), y:this.B.y + (smax + 25)*this.epsi.x}; }
},
g = g2(),
// baut und initialisiert statische Umgebung
world = g2().clr()
.view({cartesian:true,x:150,y:150})
.use({grp:g})
.nodfix({x:0,y:0})
.nodfix(mec.B0);
let phi = 0, // Laufvariable
dirty = true; // wenn true gibt es was zu aktualisieren
function position() {
g.del()
.beam2({pts:[mec.B0.x, mec.B0.y, mec.B.x, mec.B.y, mec.C.x, mec.C.y]})
.slider({...mec.A,w:(mec.psi+pi/2),fs:"@nodfill"})
.bar2({x1:mec.A0.x,y1:mec.A0.y,x2:mec.A.x,y2:mec.A.y})
.nod(mec.A)
}
function render() {
if (dirty) {
position(); // aktualisiere Position
world.exe(ctx); // rendert world in den Context
dirty = false;
}
requestAnimationFrame(render); // asynchroner callback von render(), keine Rekursion!
}
function setPhi() {
if (phislider.value != phiout.value) {
phi = phislider.value*pi/180;
phiout.innerHTML = phislider.value;
dirty = true;
}
}
/*
* Initialisierung
*/
// Eventlistener hinzufuegen
phislider.addEventListener("input",setPhi);
// Animation starten
render();
</script>
</body>
</html>